ποΈGitΠ―ΡΠ°ποΈ
docs/roadmap.md f07624be882e679affc02931dc75e8cb1594de18 (f07624be) Text, 8.65 KB
Roadmap
β Last updated: 2026-03-31
Forward-looking priorities for the Meshtastic KMP multi-target effort. For current state, see kmp-status.md. For the full gap analysis, see decisions/architecture-review-2026-03.md.
Architecture Health (Immediate)
These items address structural gaps identified in the March 2026 architecture review. They are prerequisites for safe multi-target expansion.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββ¬βββββββββ¬βββββββββ
β Item β Impact β Effort β Status β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββΌβββββββββΌβββββββββ€
β Purge T383838java.util.Locale from T383838commonMain (3 files) β High β Low β β
β
β Replace T383838ConcurrentHashMap in T383838commonMain (3 files) β High β Low β β
β
β Create T383838core:testing shared test fixtures β Medium β Low β β
β
β Add feature module T383838commonTest (settings, node, messaging) β Medium β Medium β β
β
β Desktop Koin T383838checkModules() integration test β Medium β Low β β
β
β Auto-wire Desktop ViewModels via K2 Compiler (eliminate manual wirinβ¦ β Medium β Low β β
β
β Migrate to JetBrains Compose Multiplatform dependencies β High β Low β β
β
β iOS CI gate (compile-only validation) β High β Medium β β
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββ΄βββββββββ΄βββββββββ
Active Work
Desktop Feature Completion (Phase 4)
Objective: Complete desktop wiring for all features and ensure full integration.
Current State (March 2026):
β’ β
Settings: ~35 screens with real configuration, including theme/about parity and desktop language picker support
β’ β
Nodes: Adaptive list-detail with node management
β’ β
Messaging: Adaptive contacts with message view + send
β’ β
Connections: Dynamic discovery of platform-supported transports (TCP, Serial/USB, BLE)
β’ β Map: Placeholder only, needs MapLibre or alternative
β’ β οΈ Firmware: Fully KMP (Unified OTA + native Secure DFU + USB/UF2); desktop is first-class target
β’ β οΈ Intro: Onboarding flow (may not apply to desktop)
Implementation Steps:
1. Tier 1: Core Wiring (Essential)
β’ Complete Map integration (MapLibre or equivalent)
β’ Verify all features accessible via navigation
β’ Test navigation flows end-to-end
2. Tier 2: Polish (High Priority)
β’ Additional desktop-specific settings polish
β’ β
Keyboard shortcuts via T383838onPreviewKeyEvent (MenuBar removed)
β’ Adaptive density & multitasking optimizations (2026 Desktop Guidelines)
β’ Window management
β’ State persistence
3. Tier 3: Advanced (Nice-to-have)
β’ Performance optimization
β’ Advanced map features
β’ Theme customization
β’ Multi-window support
ββββββββββββββ¬ββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Transport β Platform β Status β
ββββββββββββββΌββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β TCP β Desktop (JVM) β β
Done β shared T383838StreamFrameCodec + T383838TcpTransport in T383838core:network β
β Serial/USB β Desktop (JVM) β β
Done β jSerialComm β
β MQTT β All (KMP) β β
Completed β KMQTT in commonMain β
β BLE β All (KMP) β β
Done β Kable in T383838commonMain (T383838BleRadioInterface) β
ββββββββββββββ΄ββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Desktop Feature Gaps
βββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Feature β Status β
βββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Settings β β
~35 real screens (fully shared); T383838DeviceConfig, T383838PositionConfig, T383838SecurityConfiβ¦ β
β Node list β β
Adaptive list-detail with real T383838NodeDetailContent β
β Messaging β β
Adaptive contacts with real message view + send β
β Connections β β
Unified shared UI with dynamic transport detection β
β Metrics logs β β
TracerouteLog, NeighborInfoLog, HostMetricsLog β
β Map β β Needs MapLibre or equivalent β
β QR Generation β β
Pure KMP generation via T383838qrcode-kotlin β
β Charts β β
Vico KMP charts wired in commonMain (Device, Environment, Signal, Power, Pax) β
β Debug Panel β β
Real screen (mesh log viewer via shared T383838DebugViewModel) β
β Notifications β β
Desktop native notifications with system tray icon support β
β MenuBar β β
Removed β replaced with T383838onPreviewKeyEvent keyboard shortcuts (βQ, β,, ββ§T, ββ¦ β
β About β β
Shared T383838commonMain screen (AboutLibraries KMP T383838produceLibraries + per-platformβ¦ β
β Packaging β β
Done β Native distribution pipeline in CI (DMG, MSI, DEB) β
βββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Near-Term Priorities (30 days)
1. Evaluate KMP-native testing tools β β
Done: Fully evaluated and integrated T383838Mokkery, T383838Turbine, and T383838Kotest across the KMP modules. T383838mockk has been successfully replaced, enabling property-based and Flow testing in T383838commonTest for iOS readiness.
2. Desktop Map Integration β Address the major Desktop feature gap by implementing a raster map view using **MapComposeMP**.
β’ Implement a T383838MapComposeProvider for Desktop.
β’ Implement a Web Mercator Projection helper in T383838feature:map/commonMain to translate GPS coordinates to the 2D image plane.
β’ Leverage the existing T383838BaseMapViewModel contract.
3. Unify T383838MapViewModel β Collapse the remaining Google and F-Droid specific T383838MapViewModel classes in the T383838:app module into a single T383838commonMain implementation by isolating platform-specific settings (styles, tile sources) behind a repository interface.
4. iOS CI gate β β
Done: added T383838iosArm64()/T383838iosSimulatorArm64() to convention plugins and CI. T383838commonMain successfully compiles on iOS.
Medium-Term Priorities (60 days)
1. iOS proof target β β
Done (Stubbing): Stubbed iOS target implementations (T383838NoopStubs.kt equivalent) to successfully pass compile-time checks. Next: Setup an Xcode skeleton project and launch the iOS app.
2. Migrate to Navigation 3 Scene-based architecture β leverage the first stable release of Nav 3 to support multi-pane layouts. Investigate 3-pane "Power User" scenes (e.g., Node List + Detail + Map/Charts) on Large (1200dp) and Extra-large (1600dp) displays (Android 16 QPR3).
3. T383838core:api contract split β separate transport-neutral service contracts from the Android AIDL packaging to support iOS/Desktop service layers.
Longer-Term (90+ days)
1. Platform-Native UI Interop β
β’ iOS Maps & Camera: Implement T383838MapLibre or T383838MKMapView via Compose Multiplatform's T383838UIKitView. Leverage T383838AVCaptureSession wrapped in T383838UIKitView to fulfill the T383838LocalBarcodeScannerProvider contract.
β’ Web (wasmJs) Integrations: Leverage T383838HtmlView to embed raw DOM elements (e.g., T383838<video>, T383838<iframe>, or canvas-based maps) directly into the Compose UI tree while binding the root app via T383838CanvasBasedWindow.
2. Module maturity dashboard β living inventory of per-module KMP readiness.
3. Shared UI vs Shared Logic split β If the iOS target utilizes native SwiftUI instead of Compose Multiplatform, evaluate splitting feature modules into pure T383838sharedLogic (business rules, ViewModels) and T383838sharedUI (Compose Multiplatform) to prevent dragging Compose dependencies into pure native iOS apps.
Design Principles
1. Solve in T383838commonMain first. If it doesn't need platform APIs, it belongs in T383838commonMain.
2. Interfaces in T383838commonMain, implementations per-target. The repository pattern is established β extend it. Prefer dependency injection (Koin) with interfaces over T383838expect/T383838actual declarations whenever possible to keep architecture decoupled and highly testable.
3. UI Interop Strategies. When a Compose Multiplatform equivalent doesn't exist (e.g., Maps, Camera), use standard interop APIs rather than extracting the entire screen to native code. Use T383838AndroidView for Android, T383838UIKitView for iOS, T383838SwingPanel for JVM/Desktop, and T383838HtmlView for Web (T383838wasmJs). Always wrap these in a shared T383838commonMain interface contract (like T383838LocalBarcodeScannerProvider).
4. Stubs are a valid first implementation. Every target starts with no-op stubs, then graduates to real implementations.
5. Feature modules stay target-agnostic in T383838commonMain. Platform UI goes in platform source sets. Keep the UI layer dumb and rely on shared ViewModels (Unidirectional Data Flow) to drive state.
6. Transport is a pluggable adapter. BLE, serial, TCP, MQTT all implement T383838RadioTransport and are orchestrated by a shared T383838RadioInterfaceService.
7. CI validates every target. If a module declares T383838jvm(), CI compiles it. No exceptions. Run tests on appropriate host runners (macOS for iOS, Linux for JVM/Android) to catch platform regressions.
8. Test in T383838commonTest first. ViewModel and business logic tests belong in T383838commonTest so every target runs them. Use shared T383838core:testing utilities to minimize duplication.
9. Zero Platform Leaks. Never import T383838java.* or T383838android.* inside T383838commonMain. Use KMP-native alternatives like T383838kotlinx-datetime and T383838Okio.
Served by rngit 1.5.0 - Generated in 0.17s